/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package org.trandio.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.Statement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.naming.NamingException;
import org.trandio.model.ActividadpypVO;
import org.trandio.model.ConfigActividadDePypVO;
import org.trandio.model.PlaneacionpypVO;
import org.trandio.util.ConexionDb;

/**
 *
 * @author root
 */
public class pypDAO implements PypInterface {

    @Override
    public void programarPaciente(int paciente, int contrato) throws SQLException, NamingException {
        ConexionDb con = new ConexionDb();
        Connection conn;
        conn = con.traerConexion();

                 String sql = "select "
                         + "tb_actividadpyp.id,"
                         + "tb_actividadpyp.frecuencia"
                         + " from tb_actividadpyp"
                         + " where 3 between substring(edad_inicio from 1 for char_length(edad_inicio)-1)::integer"
                         + " AND "
                         + "Substring(edad_final from 1 for char_length(edad_final)-1)::integer"
                         + " AND substring(edad_inicio from length(edad_inicio) for 2 ) = 'A'";

        System.out.println("Sql trae la programacion: "+sql);

       PreparedStatement stmt = conn.prepareStatement(sql);

         try{
         ResultSet res = stmt.executeQuery();
         try{
            while (res.next()) {
                
                insertarPlaneacionPyp(paciente, contrato, res.getInt("id"),res.getInt("frecuencia"));
            }
            }finally{
             res.close();
         }
         }finally{
             stmt.close();
             if (!conn.isClosed())
               conn.close();
         }

    }


    public void insertarPlaneacionPyp(int paciente, int contrato, int actividad, int frecuencia) throws SQLException, NamingException {

       ConexionDb con = new ConexionDb();
       Connection conn;
       conn = con.traerConexion();


       borrarPlaneacionPacientepyp(paciente);


       String sqlAdiciona  ="INSERT INTO tb_planeacionpyp("
                + "id_actividadpyp, id_paciente, cantidad_actividades, id_contratopyp)"
                + " VALUES (?, ?, ?, ?)";

       PreparedStatement stmt = conn.prepareStatement(sqlAdiciona);


        stmt.setInt(1, actividad);
        stmt.setInt(2, paciente);
        stmt.setInt(3, frecuencia);
        stmt.setInt(4, contrato);

        stmt.execute();
        stmt.close();
               if (!conn.isClosed())
               conn.close();

    }

    @Override
    public List<PlaneacionpypVO> consultarPlaneacionPacientepyp(int pacientepyp) throws SQLException, NamingException {
        ConexionDb con = new ConexionDb();
        Connection conn;
        conn = con.traerConexion();

        String condicion = "";

        List<PlaneacionpypVO> listPlaneacionpypVO = new ArrayList<PlaneacionpypVO>();
        String sql = "SELECT "
                + "tb_planeacionpyp.id_paciente,"
                + "tb_planeacionpyp.cantidad_actividades,"
                + "tb_actividadpyp.codigo,"
                + "tb_actividadpyp.descripcion,"
                + "tb_contrato.numero,"
                + "tb_programapyp.descripcion programa,"
                + "tb_planeacionpyp.id"
                + " FROM"
                + " public.tb_planeacionpyp,"
                + " public.tb_actividadpyp,"
                + " public.tb_contrato,"
                + " public.tb_programapyp"
                + " WHERE tb_planeacionpyp.id_actividadpyp = tb_actividadpyp.id AND"
                + " tb_planeacionpyp.id_contratopyp = tb_contrato.id AND"
                + " tb_actividadpyp.id_programa = tb_programapyp.id AND"
                + " tb_planeacionpyp.id_paciente ="+pacientepyp;

        System.out.println("Sql BUSCAR planeacion: "+sql);

        PreparedStatement stmt = conn.prepareStatement(sql);
        try {
            ResultSet res = stmt.executeQuery();
            try {
                while (res.next()) {
                    PlaneacionpypVO planeacionpypVO = new PlaneacionpypVO();
                    planeacionpypVO.setId(res.getInt("id"));
                    planeacionpypVO.setPaciente(res.getInt("id_paciente"));
                    planeacionpypVO.setCantidad(res.getInt("cantidad_actividades"));
                    planeacionpypVO.setActividad(res.getString("descripcion"));
                    planeacionpypVO.setNumcontrato(res.getString("numero"));
                    planeacionpypVO.setPrograma(res.getString("programa"));
                    planeacionpypVO.setCodigoAct(res.getString("codigo")); 
                    listPlaneacionpypVO.add(planeacionpypVO);
                }
            } finally {
                res.close();
            }
        } finally {
            stmt.close();
            if (!conn.isClosed())
               conn.close();
        }

        return listPlaneacionpypVO;
    }



    public void borrarPlaneacionPacientepyp(int paciente) throws SQLException, NamingException {
        ConexionDb con = new ConexionDb();
        Connection conn;
        conn = con.traerConexion();
        String sql = "delete from tb_planeacionpyp where tb_planeacionpyp.id_paciente=?";
        PreparedStatement stmt = conn.prepareStatement(sql);
        stmt.setInt(1, paciente);
        stmt.execute();
        stmt.close();
    }

    @Override
    public PlaneacionpypVO consultarPlaneacionPacientepyp(int pac, int act) throws SQLException, NamingException {
        ConexionDb con = new ConexionDb();
        Connection conn;
        conn = con.traerConexion();

        String condicion = "";
       
        String sql = "SELECT "
                + "tb_planeacionpyp.id_paciente,"
                + "tb_planeacionpyp.cantidad_actividades,"
                + "tb_actividadpyp.codigo,"
                + "tb_actividadpyp.descripcion,"
                + "tb_contrato.numero,"
                + "tb_contrato.id idcontrato,"
                + "tb_contrato.descripcion contrato,"
                + "tb_programapyp.descripcion programa,"
                + "tb_planeacionpyp.id,"
                + "tb_planeacionpyp.id_actividadpyp"
                + " FROM"
                + " public.tb_planeacionpyp,"
                + " public.tb_actividadpyp,"
                + " public.tb_contrato,"
                + " public.tb_programapyp"
                + " WHERE tb_planeacionpyp.id_actividadpyp = tb_actividadpyp.id_actividad AND"
                + " tb_planeacionpyp.id_contratopyp = tb_contrato.id AND"
                + " tb_actividadpyp.id_programa = il.tb_programapyp.id AND"
                + " tb_planeacionpyp.id_paciente ="+pac+" AND tb_actividadpyp.id_actividad="+act;

        
        // + " tb_planeacionpyp.id_paciente ="+pac+" AND (tb_actividadpyp.id_actcups="+act+" OR tb_actividadpyp.id_actcups="+act+")";
        System.out.println("Sql BUSCAR planeacion para facturacion: "+sql);

        PlaneacionpypVO planeacionpypVO = new PlaneacionpypVO();

        PreparedStatement stmt = conn.prepareStatement(sql);
        try {
            ResultSet res = stmt.executeQuery();
            try {
                if(res.next()) {                    
                    planeacionpypVO.setId(res.getInt("id"));
                    planeacionpypVO.setPaciente(res.getInt("id_paciente"));
                    planeacionpypVO.setCantidad(res.getInt("cantidad_actividades"));
                    planeacionpypVO.setActividad(res.getString("descripcion"));
                    planeacionpypVO.setNumcontrato(res.getString("numero"));
                    planeacionpypVO.setPrograma(res.getString("programa"));
                    planeacionpypVO.setId_contrato(res.getInt("idcontrato"));
                    planeacionpypVO.setDescontrato(res.getString("contrato"));
                    planeacionpypVO.setId_actividad(res.getInt("id_actividadpyp"));  

                }
            } finally {
                res.close();
            }
        } finally {
            stmt.close();
            if (!conn.isClosed())
               conn.close();
        }

        return planeacionpypVO;
    }


    @Override
    public PlaneacionpypVO getPlaneacionPacientepyp(int idplaneacionpyp) throws SQLException, NamingException {
        ConexionDb con = new ConexionDb();
        Connection conn;
        conn = con.traerConexion();

        String condicion = "";

        String sql = "SELECT "
                + "tb_planeacionpyp.id_paciente,"
                + "tb_planeacionpyp.cantidad_actividades,"
                + "tb_actividadpyp.codigo,"
                + "tb_actividadpyp.frecuencia,"                
                + "tb_actividadpyp.descripcion,"
                + "substring(tiempo from 1 for char_length(tiempo)-1)::integer tiempo,"
                + "substring(edad_inicio from length(edad_inicio) for 2 ) medida,"
                + "tb_contrato.numero,"
                + "tb_contrato.id idcontrato,"
                + "tb_contrato.fecha_fin-tb_contrato.fecha_inicio dias_contrato,"
                + "tb_contrato.descripcion contrato,"
                + "tb_programapyp.descripcion programa,"
                + "tb_planeacionpyp.id,"
                + "tb_planeacionpyp.id_actividadpyp,"
                + "current_date fecha_actual"
                + " FROM"
                + " public.tb_planeacionpyp,"
                + " public.tb_actividadpyp,"
                + " public.tb_contrato,"
                + " public.tb_programapyp"
                + " WHERE tb_planeacionpyp.id_actividadpyp = tb_actividadpyp.id AND"
                + " tb_planeacionpyp.id_contratopyp = tb_contrato.id AND"
                + " tb_actividadpyp.id_programa = tb_programapyp.id AND"
                + " tb_planeacionpyp.id="+idplaneacionpyp;

        System.out.println("Sql BUSCAR planeacion para facturacion: "+sql);

        PlaneacionpypVO planeacionpypVO = new PlaneacionpypVO();

        PreparedStatement stmt = conn.prepareStatement(sql);
        try {
            ResultSet res = stmt.executeQuery();
            try {
                if(res.next()) {
                    planeacionpypVO.setId(res.getInt("id"));
                    planeacionpypVO.setPaciente(res.getInt("id_paciente"));
                    planeacionpypVO.setCantidad(res.getInt("cantidad_actividades"));
                    planeacionpypVO.setActividad(res.getString("descripcion"));
                    planeacionpypVO.setNumcontrato(res.getString("numero"));
                    planeacionpypVO.setPrograma(res.getString("programa"));
                    planeacionpypVO.setId_contrato(res.getInt("idcontrato"));
                    planeacionpypVO.setDescontrato(res.getString("contrato"));
                    planeacionpypVO.setId_actividad(res.getInt("id_actividadpyp"));
                    planeacionpypVO.setTiempo(res.getInt("tiempo"));
                    planeacionpypVO.setMedidaTiempo(res.getString("medida"));
                    planeacionpypVO.setDiasContrato(res.getInt("dias_contrato"));
                    planeacionpypVO.setFecha_actual(res.getDate("fecha_actual"));
                }
            } finally {
                res.close();
            }
        } finally {
            stmt.close();
            if (!conn.isClosed())
               conn.close();
        }

        return planeacionpypVO;
    }




    @Override
    public int setProgramacionPyp(int idplaneacionpyp, Date fecha, int cantidad) throws SQLException, NamingException {
       ConexionDb con = new ConexionDb();
       Connection conn;
       conn = con.traerConexion();


       System.out.println(idplaneacionpyp+"---"+fecha+"-----"+cantidad);
       

       String sqlAdiciona  ="INSERT INTO tb_programacionpyp(id_planeacionpyp, fecha, cantidad)"
                           +"VALUES (?, ?, ?) RETURNING id;";

       PreparedStatement stmt = conn.prepareStatement(sqlAdiciona);


        java.util.Date fec = fecha;
        java.sql.Date fecsql = new java.sql.Date(fec.getTime());

        stmt.setInt(1, idplaneacionpyp);
        stmt.setDate(2, fecsql);
        stmt.setInt(3, cantidad);

        ResultSet rs = stmt.executeQuery();
        rs.next();
        int resp = rs.getInt(1);

        stmt.close();
               if (!conn.isClosed())
               conn.close();

        return resp;
    }


     @Override
    public void setEjecucionPyp(int idprogpyp, Date fecha, int cantidad, int iddetalle) throws SQLException, NamingException {
       ConexionDb con = new ConexionDb();
       Connection conn;
       conn = con.traerConexion();



        String sqlAdiciona  ="INSERT INTO tb_ejecucionpyp("
                            +"id_programacionpyp, fecha, cantidad, id_detalle_factura)"
                            + "VALUES (?, ?, ?, ?)";

        PreparedStatement stmt = conn.prepareStatement(sqlAdiciona);


        java.util.Date fec = fecha;
        java.sql.Date fecsql = new java.sql.Date(fec.getTime());

        stmt.setInt(1, idprogpyp);
        stmt.setDate(2, fecsql);
        stmt.setInt(3, cantidad);
        stmt.setInt(4, iddetalle);

        stmt.execute();
        stmt.close();
               if (!conn.isClosed())
               conn.close();
    }

    @Override
    public boolean verificarProgramacion(int idplaneacionpyp) throws SQLException, NamingException {
        ConexionDb con = new ConexionDb();
        Connection conn;
        conn = con.traerConexion();
        
        String sql = "select count(*) cant from tb_programacionpyp"
                   + " where id_planeacionpyp="+idplaneacionpyp;
        
        int cant = 0;

        PreparedStatement stmt = conn.prepareStatement(sql);
        try {
            ResultSet res = stmt.executeQuery();
            try {
                if(res.next()) {
                    cant = res.getInt("cant");
                }
            } finally {
                res.close();
            }
        } finally {
            stmt.close();
            if (!conn.isClosed())
               conn.close();
        }


        if(cant>0){
            return true;
        }else{
            return false;
        }

  }

    @Override
    public int getEjecucionpyp(int idplaneacionpyp) throws SQLException, NamingException {
         ConexionDb con = new ConexionDb();
        Connection conn;
        conn = con.traerConexion();

        String sql = "SELECT min(tb_programacionpyp.id) idprog "
                   + "FROM tb_programacionpyp"
                   + " WHERE tb_programacionpyp.id NOT IN (select tb_ejecucionpyp.id_programacionpyp "
                   + " from tb_ejecucionpyp) "
                   + " AND tb_programacionpyp.id_planeacionpyp = "+idplaneacionpyp;

        int idprog = 0;

        PreparedStatement stmt = conn.prepareStatement(sql);
        try {
            ResultSet res = stmt.executeQuery();
            try {
                if(res.next()) {
                    idprog = res.getInt("idprog");
                }
            } finally {
                res.close();
            }
        } finally {
            stmt.close();
            if (!conn.isClosed())
               conn.close();
        }

       return idprog;
    }
    
    
    
@Override    
public void quitarPlaneacionPyp(int id_planeacion) throws SQLException, NamingException {
        ConexionDb con = new ConexionDb();
        Connection conn;
        conn = con.traerConexion();

        String sql = "DELETE FROM tb_planeacionpyp"
                   + " WHERE tb_planeacionpyp.id=" + id_planeacion;
     
        Statement stmt = conn.createStatement();
        stmt.executeUpdate(sql);
        stmt.close();
        

    }
    
    


@Override
    public ConfigActividadDePypVO consultarConfigurcionActividadDePyp(int idActividad, int idSexo, int edad, int cantidad) throws SQLException, NamingException{
        ConexionDb con = new ConexionDb();
        Connection conn;
        conn = con.traerConexion();

        String condicion = "";
        
        int act=0;
        int pac=0;
       
        String sql = "SELECT "
                + "tb_planeacionpyp.id_paciente,"
                + "tb_planeacionpyp.cantidad_actividades,"
                + "tb_actividadpyp.codigo,"
                + "tb_actividadpyp.descripcion,"
                + "tb_contrato.numero,"
                + "tb_contrato.id idcontrato,"
                + "tb_contrato.descripcion contrato,"
                + "tb_programapyp.descripcion programa,"
                + "tb_planeacionpyp.id,"
                + "tb_planeacionpyp.id_actividadpyp"
                + " FROM"
                + " public.tb_planeacionpyp,"
                + " public.tb_actividadpyp,"
                + " public.tb_contrato,"
                + " public.tb_programapyp"
                + " WHERE tb_planeacionpyp.id_actividadpyp = tb_actividadpyp.id AND"
                + " tb_planeacionpyp.id_contratopyp = tb_contrato.id AND"
                + " tb_actividadpyp.id_programa = tb_programapyp.id AND"
                + " tb_planeacionpyp.id_paciente ="+pac+" AND (tb_actividadpyp.id_actcups="+act+" OR tb_actividadpyp.id_actcups="+act+")";

        System.out.println("Sql BUSCAR planeacion para facturacion: "+sql);

        ConfigActividadDePypVO configActividadDePypVO = new ConfigActividadDePypVO();

        PreparedStatement stmt = conn.prepareStatement(sql);
        try {
            ResultSet res = stmt.executeQuery();
            try {
                if(res.next()) {                    
                   /* planeacionpypVO.setId(res.getInt("id"));
                    planeacionpypVO.setPaciente(res.getInt("id_paciente"));
                    planeacionpypVO.setCantidad(res.getInt("cantidad_actividades"));
                    planeacionpypVO.setActividad(res.getString("descripcion"));
                    planeacionpypVO.setNumcontrato(res.getString("numero"));
                    planeacionpypVO.setPrograma(res.getString("programa"));
                    planeacionpypVO.setId_contrato(res.getInt("idcontrato"));
                    planeacionpypVO.setDescontrato(res.getString("contrato"));
                    planeacionpypVO.setId_actividad(res.getInt("id_actividadpyp"));  */

                }
            } finally {
                res.close();
            }
        } finally {
            stmt.close();
            if (!conn.isClosed())
               conn.close();
        }

        return configActividadDePypVO;
    }



}
